package net.hands.common.web.html.simulate;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.net.URL;

import net.hands.common.ClassUtils;
import net.hands.common.IoUtils;
import net.hands.common.logger.Log;
import net.hands.common.logger.LogFactory;
import net.hands.common.web.html.js.JavascriptUtils;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextFactory;
import org.mozilla.javascript.Scriptable;

/**
 * 说明:模拟html
 * <br>
 * <p>这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。</p>
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public abstract class HtmlSimulate {

	static Log log = LogFactory.getLogger(HtmlSimulate.class);
   /**
    * 环境
    */
	static Context ctx;
	/**
	 * 在执行范围
	 */
	static Scriptable scope;
	
	static {
		ctx = ContextFactory.getGlobal().enter();//获得环境入口
		ctx.setOptimizationLevel(-1);//设置优化等级
		ctx.setLanguageVersion(Context.VERSION_1_5);//设置语言版本

		scope = ctx.initStandardObjects();//初始化对象的标准。
		//转化成脚本
		eval("function print(message) { java.lang.System.out.println(message); }", "print");
		try {
			eval(IoUtils.getStringFromInputStream(ClassUtils.getResourceAsStream(HtmlSimulate.class,
					"env.rhino.1.2.js")), "env.rhino.1.2"); //加载rhino
			eval(IoUtils.getStringFromInputStream(new URL("http://code.jquery.com/jquery-1.7.2.min.js")
					.openStream()), "jquery");//加载jquery
		} catch (final Throwable e) {
			log.error(e);
		}
	}
   /**
   * 说明:js源码估算 提供的源名称和行号用于错误消息和生产调试信息
   * @param source 带js源码
   * @param sourceName 源吗名
   * @update 2012-9-20 下午2:16:36
    */
	public static void eval(final String source, final String sourceName) {
		ctx.evaluateString(scope, source, sourceName, 1, null);
	}
   /**
   * 说明:源码估算
   * @param source js源码
   * @update 2012-9-20 下午2:19:05
    */
	public static void eval(final String source) {
		eval(source, null);
	}
   /**
   * 说明:返回评估后html 返回html中去除了 javascript
   * 加入 <script xmlns="http://n.validator.nu/placeholder/" Type="\&quot;text\/javascript\&quot;"/>
   * @param html html语言
   * @return String
   * @throws IOException
   * @update 2012-9-20 下午2:19:17
    */
	public static String htmlToHtml(final String html) throws IOException {
		scope.put("req", scope, new BufferedReader(new StringReader(html)));//设置指定属性的值,如果需要创建它。
		eval(IoUtils.getStringFromInputStream(ClassUtils.getResourceAsStream(HtmlSimulate.class,
				"parser.utils.js")), "parser.utils");
		return String.valueOf(scope.get("req", scope));//返回html中去出来了javascript内容
	}
   /**
   *说明:传参数未处理? 获得命名的属性的对象  估计为无效方法
   * @param url 访问地址
   * @return String
   * @throws IOException
   * @update 2012-9-20 下午2:20:39
    */
	public static String urlToHtml(final String url) throws IOException {
		return String.valueOf(scope.get("req", scope));//获得命名的属性的对象。

	}
   /**
   * 说明:测试
   * @param args
   * @update 2012-9-20 下午2:48:36
    */
	public static void main(final String[] args) {
		try {
//			 scope.put("oUrl", scope, "http://www.baidu.com/");
			// eval(IoUtils.getStringFromInputStream(ClassUtils.getResourceAsStream(HtmlSimulate.class,
			// "parser.utils.js")), "parser.utils");
//			 System.out.println(scope.get("oUrl", scope));
         
			System.out.println(htmlToHtml(JavascriptUtils.escape(IoUtils.getStringFromInputStream(ClassUtils
					.getResourceAsStream(HtmlSimulate.class, "test_case.html")))));

//			 System.out
//			 .println(urlToHtml("http://localhost:9090/dtproject/demo/com-sansoft-project-biaozhun-MyBiaozhunPage"));
		} catch (final Exception e) {
			e.fillInStackTrace();
		}
	}
}
